package com.heima.search.service.impl;

import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.search.dtos.HistorySearchDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.search.pojos.ApUserSearch;
import com.heima.search.service.ApUserSearchService;
import com.heima.utils.thread.AppThreadLocalUtil;
import com.mongodb.client.result.DeleteResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.List;

@Service
@Slf4j
public class ApUserSearchServiceImpl implements ApUserSearchService {

    @Autowired
    private MongoTemplate mongoTemplate;
    /**
     * 保存用户搜索历史记录
     * @param keyword
     * @param userId
     */
    @Override
    @Async //表明这是异步调用方法，想要他生效需要在启动类里加@EnableAsync开启异步调用
    //因为当前方法是异步调用，说明是重新开了一个线程去执行该方法，(只能从主线程中获取当前用户)所以不能使用ThreadLocal去获取用户信息，所以需要从外面(主线程)传userId进去
    public void insert(String keyword, Integer userId) {
        //1.查询当前用户的搜索关键词
        Query query = Query.query(Criteria.where("userId").is(userId).and("keyword").is(keyword));
        ApUserSearch apUserSearch = mongoTemplate.findOne(query, ApUserSearch.class);

        //2.存在 更新创建时间
        if(apUserSearch != null){
            log.info("搜索关键词已存在---更新创建时间{}",new Date());

//            ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Shanghai")); // 根据需要设置时区
//            log.info("显示当前本地时间（CST）{}",now);// 显示当前本地时间（CST）
//            apUserSearch.setCreatedTime(Date.from(now.toInstant()));

//            // 获取当前的 LocalDateTime
//            LocalDateTime localDateTime = LocalDateTime.now();
//
//            // 指定时区为中国标准时间
//            ZoneId zoneId = ZoneId.of("Asia/Shanghai");
//
//            // 将 LocalDateTime 转换为 Date
//            Date date = Date.from(localDateTime.atZone(zoneId).toInstant());
//
//            log.info("显示当前本地时间（CST）{}",date);// 显示当前本地时间（CST）
//            apUserSearch.setCreatedTime(date);//new Date()

            apUserSearch.setCreatedTime(new Date());
            mongoTemplate.save(apUserSearch);//save()有id，则更新，否则新增
            return;
        }

        //3.不存在，判断当前历史记录总数量是否超过10
        log.info("搜索关键词不存在---新增搜索记录");
        apUserSearch = new ApUserSearch();
        apUserSearch.setUserId(userId);
        apUserSearch.setKeyword(keyword);
        apUserSearch.setCreatedTime(new Date());

        Query query1 = Query.query(Criteria.where("userId").is(userId));
        query1.with(Sort.by(Sort.Direction.DESC,"createdTime"));
        List<ApUserSearch> apUserSearchList = mongoTemplate.find(query1, ApUserSearch.class);

        if(apUserSearchList == null || apUserSearchList.size() < 10){
            mongoTemplate.save(apUserSearch);//新增搜索记录
        }else {
            //超过10，删除最旧的记录，再保存
            log.info("搜索关键词超过10条---删除最旧的记录");
            ApUserSearch lastUserSearch = apUserSearchList.get(apUserSearchList.size() - 1);//第n-1条数据
            //假设lastUserSearch.getId()返回的是"12345"，并且apUserSearch是一个新的用户搜索对象，替换的过程将如下所示：

            //如果数据库中存在{"id": "12345", ...}的文档，它将被apUserSearch的内容替换。
            //如果不存在，则没有任何操作发生。
            mongoTemplate.findAndReplace(Query.query(Criteria.where("id").is(lastUserSearch.getId())),apUserSearch);
        }


    }

    /**
     * 查询搜索历史
     * @return
     */
    @Override
    public ResponseResult findUserSearch() {
        //获取当前用户
        ApUser user = AppThreadLocalUtil.getUser();
        if(user == null){
            //没有登录,不知道是谁的搜索历史
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
        }

        //根据用户查询数据，按照时间倒序
        List<ApUserSearch> apUserSearches = mongoTemplate.find
                (Query.query(Criteria.where("userId").is(user.getId()))
                        .with(Sort.by(Sort.Direction.DESC,"createdTime")), ApUserSearch.class);
        return ResponseResult.okResult(apUserSearches);
    }

    /**
     * 删除历史记录
     * @param id//dto
     * @return
     */
    @Override
    public ResponseResult delUserSearch(String id) {//HistorySearchDto dto
        log.info("删除历史记录参数---{}",id);//dto
        //1.检查参数
        if(id == null){//dto.getId()
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }

        //2.判断是否登录
        ApUser user = AppThreadLocalUtil.getUser();
        if(user == null){
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
        }

        //3.删除
        DeleteResult result = mongoTemplate.remove(Query.query(Criteria
                //用户id
                .where("userId").is(user.getId())
                //搜索历史记录id
                .and("id").is(id)),//dto.getId()
                ApUserSearch.class);
        if (result.wasAcknowledged()) {
            log.info("删除了{}条搜索记录",result.getDeletedCount());
        }
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }
}
